#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QtDebug>
#include <QMessageBox>
#include <QColorDialog>
#include <QFileDialog>
#include <QFontDialog>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //点击新建按钮，弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=](){
//    对话框->分类：模态对话框、非模态对话框
//    非模态对话框：打开之后可以对其他窗口进行操作
//    模态对话框：打开之后不可以对其他窗口进行操作



//        /*模态创建*/
//        QDialog dlg(this);//创建对话框对象，并指定父亲为this，这样将其放到对象树上面，便不用在管释放操作
//        //this为父窗口指针。如果使用了this，dialog显示在父窗口的中心
//        //如果不使用，那么默认为NULL，即dialog是主窗口，显示在屏幕的中心
//        dlg.resize(200,100);
//        dlg.exec();//程序会在这里阻塞，然后不会往下继续执行，比如下面的qDebug就只有在关闭窗口之后才会打印
//        qDebug()<<"模态对话框弹出了";


//        /*非模态创建*/
//        QDialog * dlg2 = new QDialog(this);
//        dlg2->resize(200,100);
//        dlg2->setAttribute(Qt::WA_DeleteOnClose);//设置属性：关闭时，删除对象，放置大量点击新建之后内存泄漏，程序崩溃
//        dlg2->show();
//        qDebug()<<"非模态对象弹出了";

        /*消息对话框*/
        //错误对话框
        //QMessageBox::critical(this, "critical", "不对");//这是一个模态对话框
        //信息对话框
        //QMessageBox::information(this, "information", "信息");//这是一个模态对话框
//        //提问对话框
//        //参数1：父亲；参数2：标题；参数3：提示内容；参数4：按键类型；参数5：默认关联回车按键
//        //QMessageBox::question(this, "question", "干啥呢");//这种情况下，对话框的两个按钮是Yes和No
//        if(QMessageBox::Save == QMessageBox::question(this, "question", "你想干啥", QMessageBox::Save|QMessageBox::Cancel, QMessageBox::Cancel))//默认的按钮为cancle
//        //QMessageBox::question的返回值，就是设定的按键类型
//        {
//            qDebug()<<"选择的是Save";
//        }else {
//            qDebug()<<"选择的是Cancel";
//        }

        //警告对话框
        //QMessageBox::warning(this, "warning", "警告");



//        /*其他标准对话框*/
//        //颜色对话框
//        QColor color = QColorDialog::getColor(QColor(255,0,0));//产生一个颜色对话框，默认停留在红色（255、0、0是红色）
//        //返回值是颜色信息
//        qDebug()<<"r="<<color.red()<<";g="<<color.green()<<";b="<<color.blue();

//        //文件对话框
//        //参数1父亲；参数2标题；参数3默认打开路径；参数4过滤的文件的格式
//        //返回值是选取的路径
//        QString str = QFileDialog::getOpenFileName(this,"打开文件", "C:/Users/62320/Desktop", "(*.png)");
//        qDebug()<<str;

        //字体对话框
        bool flag;
        QFont font = QFontDialog::getFont(&flag, QFont("华文彩云", 36));
        //这里font.family的返回值是QString而不是char*，需要转换成char *
        qDebug()<<"family:"<<font.family().toUtf8().data()<<"size="<<font.pointSize()<<"是否加粗："<<font.bold()<<"是否倾斜："<<font.italic();


//        QDialog dlg(this);
//        dlg.show();
//在上面这两行语句中，show没有exec的阻塞功能，该Lambda匿名函数执行完毕之后，dlg2对象就不存在了，所以对话框只是闪一下就消失
//所以这是应当使用QDialog * dlg2 = new QDialog(this);语句，使用dlg2指针指向一个实体对象，new出来的对象是不会释放掉的
//这样，就算Lambda表达式执行完毕，对话框也不会消失



//QDialog是类，dlg是指针对象，dlg指向new创建的QDialog类型的对象实体。
//this指针是C++的东西，表示当前类本身。
//把this作为dialog所指对象实体的父级，前提是当前类必定是继承自QObject，
//比如当前类是QWidget的派生类，则这段代码表示以当前窗口为父窗口，创建一个子对话框窗口
//(父窗口释放的时候，子窗口或子控件也会被释放)


//c++中 . 和 -> 主要是用法上的不同。
//1、A.B则A为对象或者结构体；
//2、A->B则A为指针，->是成员提取，A->B是提取A中的成员B，A只能是指向类、结构、联合的指针；

    });
}

MainWindow::~MainWindow()
{
    delete ui;
}
